package fz.vrd.library.page.activity;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.annotation.Nullable;

/**
 * <b>名称：  <br/>
 * <b>创建人： VinRichard <br/>
 * <b>时间： 2021/8/25 14:17 <br/>
 * <b>备注：{ } <br/>
 */

@SuppressLint("JavascriptInterface")
public abstract class BaseWebviewAc extends BaseAc {

    public abstract int getLayoutId();

    public abstract void init();

    WebView webView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getLayoutId() > 0) {
            setContentView(getLayoutId());
        }
        init();
    }


    protected void initWebView(WebView webView) {
        this.webView = webView;
        //设置自适应屏幕，两者合用
        webView.getSettings().setUseWideViewPort(true);////将图片调整到适合webView的大小
        webView.getSettings().setLoadWithOverviewMode(true);// 缩放至屏幕的大小
        /**
        LOAD_DEFAULT：默认设置，当有缓存而且没有过期使用缓存，否则使用网络数据。
        LOAD_CACHE_ELSE_NETWORK：只要有缓存就使用缓存，即使已经过期，否则使用网络数据。
        LOAD_NO_CACHE：不使用缓存，只加载网络数据。
        LOAD_CACHE_ONLY：不使用网络，只使用缓存数据。
         */
        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);

        //如果访问的页面中要与Javascript交互，则webView必须设置支持Javascript
        webView.getSettings().setJavaScriptEnabled(true);

        //设置可以访问文件
        webView.getSettings().setAllowFileAccess(true);
        //支持通过JS打开新窗口
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        // 开启 DOM storage API 功能
        webView.getSettings().setDomStorageEnabled(true);
        //开启 database storage API 功能
        webView.getSettings().setDatabaseEnabled(true);
        //开启 Application Caches 功能
        webView.getSettings().setAppCacheEnabled(true);
        //支持自动加载图片
        webView.getSettings().setLoadsImagesAutomatically(true);
        //设置编码格式
        webView.getSettings().setDefaultTextEncodingName("utf-8");

        //支持屏幕缩放 设置webView可触摸放大缩小
        webView.getSettings().setSupportZoom(true);
        //设置内置的缩放控件。若为false，则该webView不可缩放
        webView.getSettings().setBuiltInZoomControls(true);
        //不显示webView缩放按钮
        webView.getSettings().setDisplayZoomControls(false);
        //垂直进度条
        webView.setVerticalScrollBarEnabled(false);
        //水平进度条
        webView.setHorizontalScrollBarEnabled(false);

        // android 5.0以上默认不支持Mixed Content
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webView.getSettings().setMixedContentMode(
                    WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
        }

        if (isInitWebViewClient()) {
            initWebViewClient(webView);
        }

        if (isInitWebChromeClient()) {
            initWebChromeClient(webView);
        }

        webView.addJavascriptInterface(this, getAndroidObj());
    }

    /**
     * @return 原生和js交互的时候,在js中的调用方法的对象
     */
    public String getAndroidObj(){
        return "android";
    }


    void initWebViewClient(final WebView webView) {

        webView.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {

                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

            }

            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);

            }

            @Override
            public void onLoadResource(WebView view, String url) {
                super.onLoadResource(view, url);

            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    webView.getSettings()
                            .setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
                }
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);

            }
        });
    }

    void initWebChromeClient(WebView webView) {

        webView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message,
                                     JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }

            @Override
            public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePath, FileChooserParams fileChooserParams) {

                return super.onShowFileChooser(webView, filePath, fileChooserParams);
            }
        });
    }

    /**
     * 是否 初始化  WebViewClient
     */
    protected boolean isInitWebViewClient() {
        return true;
    }

    /**
     * 是否 初始化  WebChromeClient
     */
    protected boolean isInitWebChromeClient() {
        return true;
    }

    @SuppressLint("NewApi")
    @Override
    protected void onResume() {
        super.onResume();
        if (webView != null) {
            webView.onResume();
        }
    }

    @SuppressLint("NewApi")
    @Override
    protected void onPause() {
        super.onPause();
        if (webView != null) {
            webView.onPause();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (webView != null) {
            webView.destroy();
        }
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView != null && webView.canGoBack()) {
            webView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void back() {
        super.back();

    }
}
